#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <semaphore.h>
#include <pthread.h>
#include <signal.h>

#include <common.h>
#include <gpio.h>


static int buzzer_Pin = 1;
static int fd;


static sem_t buzzer_sem;
static pthread_t buzzer_tid;
static volatile sig_atomic_t buzzer_abort = 0;

/*
 *  函数名：buzzer_open
 *  功能说明：打开并初始化蜂鸣器GPIO
 *  参数：无
 *  返回值：int - 成功返回0，失败返回-1
 *  日期：2025年3月
 */
int buzzer_open(void)
{

    sprintf(gpio_path, "/sys/class/gpio/gpio%d", buzzer_Pin);
    if(access(gpio_path, F_OK))
    {
        
        int len;
        char pin[10];
        len = snprintf(pin, sizeof(pin), "%d", buzzer_Pin);

        if(0 > (fd = open("/sys/class/gpio/export", O_WRONLY)))
        {
            printf_d("open error\n");
            perror("open error");
            return -1;
        }

        if(len != write(fd, pin, len))
        {
            printf_d("write error\n");
            perror("write error");
            close(fd);
            return -1;
        }
        close(fd);
    }

    if(gpio_config("direction", "out"))
        return -1;
    if(gpio_config("active_low", "1"))
        return -1;
    if(gpio_config("value", "0"))
        return -1;

    //初始化信号量
    sem_init(&buzzer_sem, 0, 0);
    return 0;
}

/*
 *  函数名：buzzer_on
 *  功能说明：打开蜂鸣器
 *  参数：无
 *  返回值：void
 *  日期：2025年3月
 */
void buzzer_on(void)
{
    if(gpio_config("value", "1"))
        return;
}

/*
 *  函数名：buzzer_off
 *  功能说明：关闭蜂鸣器
 *  参数：无
 *  返回值：void
 *  日期：2025年3月
 */
void buzzer_off(void)
{
    if(gpio_config("value", "0"))
        return;
}

/*
 *  函数名：buzzer_thread
 *  功能说明：蜂鸣器线程函数
 *  参数：void *args - 线程参数
 *  返回值：void* - 线程返回值
 *  日期：2025年3月
 */
static void* buzzer_thread(void *args)
{
    while(!buzzer_abort)
    {
        sem_wait(&buzzer_sem);
        if(buzzer_abort) break;

        buzzer_on();
        usleep(500 * 1000);
        buzzer_off();
        usleep(300 * 1000);
        buzzer_on();
        usleep(500 * 1000);
        buzzer_off();
    }
    return NULL;
}

/*
 *  函数名：buzzer_init
 *  功能说明：初始化蜂鸣器
 *  参数：无
 *  返回值：int - 成功返回0，失败返回-1
 *  日期：2025年3月
 */
int buzzer_init(void)
{
    if(buzzer_open() < 0)
    {
        return -1;
    }

    /* 设置线程属性，分离状态 */
    pthread_attr_t attr;
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
    if(pthread_create(&buzzer_tid, &attr, buzzer_thread, NULL)) {
        perror("buzzer thread create failed");
        return -1;
    }
    pthread_attr_destroy(&attr);
    return 0;
}

/*
 *  函数名：buzzer_close
 *  功能说明：关闭蜂鸣器
 *  参数：无
 *  返回值：void
 *  日期：2025年3月
 */
void buzzer_close(void)
{
    close(fd);
}

/*
 *  函数名：buzzer_trigger
 *  功能说明：触发蜂鸣器
 *  参数：int duration_ms - 持续时间（毫秒）
 *  返回值：void
 *  日期：2025年3月
 */
void buzzer_trigger(int duration_ms)
{
    buzzer_on();
    usleep(duration_ms * 1000);
    buzzer_off();
}

/*
 *  函数名：buzzer_alert
 *  功能说明：触发蜂鸣器报警
 *  参数：无
 *  返回值：void
 *  日期：2025年3月
 */
void buzzer_alert(void)
{
    sem_post(&buzzer_sem);  //触发蜂鸣器线程
}


